#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn = 1e6 + 10;
int n;
vector<int> adj[maxn];
int du[maxn]; // 记录每个节点的度
int dep[maxn]; // 每个节点深度
int max_dep[maxn]; // 每个节点的子树的最大深度
// 记录每个节点深度
void dfs1(int u, int fa){
	max_dep[u]=dep[u];
	for(auto nex: adj[u]){
		if(nex==fa){
			continue;
		}
		dep[nex]=dep[u]+1;
		dfs1(nex, u);
		max_dep[u]=max(max_dep[u], max_dep[nex]); // 注意这里面需要使用  max_dep 来更新, 而不是 dep
	}
}

// 节点的深度从小到大排序
bool cmp(int a, int b){
	return max_dep[a]==max_dep[b] ? a<b : max_dep[a]<max_dep[b];
}

vector<int> path; // 存储 dfs 的路径
void dfs2(int u, int fa){
	path.push_back(u);
	sort(adj[u].begin(), adj[u].end(), cmp); // 子树深度从小到大排序
	for(auto nex: adj[u]){
		if(nex==fa){
			continue;
		}
		dfs2(nex,u);
		// 这颗子树遍历完了后, 在将该节点存进去, 类似于于回溯的那个过程
		path.push_back(u);
	}
}

void solve(){
	cin>>n;
	for(int i=1;i<=n-1;i++){
		int u,v;
		cin>>u>>v;
		adj[u].push_back(v); du[v]++;
		adj[v].push_back(u); du[u]++;
	}
	dfs1(1, 0); // 记录每个节点的深度 
	dfs2(1, 0); // 得到遍历的序列, 从而进一步计算答案
	
	// 统计答案
	int ans=0;
	int cnt=0; // 记录的是从相邻叶子节点到该叶子节点之间的距离
	for(int x: path){
		if(du[x]==1){ // 叶子节点
			ans+=min(dep[x], cnt); // 从根节点直接派过来还是从相邻叶子节点过来
			cnt=0; // cnt 重新置 0 
		}
		cnt++;
	}
	cout<<ans<<'\n';
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
